unit VendaFrDM;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ZDataset, ZSqlUpdate, ZSequence, MainDM, DB, QueryConditions;

type

  { TVendaFrData }

  TVendaFrData = class(TMainDataModule)
    ItensDatasource: TDatasource;
    ItensZQuerycodigo_barra: TStringField;
    ItensZQuerydesconto: TFloatField;
    ItensZQuerydesc_produto: TStringField;
    ItensZQueryid_produto: TLargeintField;
    ItensZQueryid_venda: TLargeintField;
    ItensZQueryid_venda_produto: TLargeintField;
    ItensZQueryitens: TFloatField;
    ItensZQueryquantidade: TFloatField;
    ItensZQueryvalor: TFloatField;
    VendaIDatasource: TDatasource;
    VendaIZQuery: TZQuery;
    VendaIZQuerydata: TDateField;
    VendaIZQuerydesconto: TFloatField;
    VendaIZQuerydesc_forma_pagamento: TStringField;
    VendaIZQueryhora: TTimeField;
    VendaIZQueryid_cliente: TLargeintField;
    VendaIZQueryid_condicao_pagamento: TLargeintField;
    VendaIZQueryid_usuario: TLargeintField;
    VendaIZQueryid_venda: TLargeintField;
    VendaIZQueryitens: TFloatField;
    VendaIZQuerynome_pessoa: TStringField;
    VendaIZQuerysigla_forma_pagamento: TStringField;
    VendaIZQueryvalor: TFloatField;
    VendaIZQueryvalor_total: TFloatField;
    AuxiliarZQuery: TZQuery;
    VendaIZUpdate: TZUpdateSQL;
    ItensZQuery: TZQuery;
    ItensZUpdate: TZUpdateSQL;
    procedure DataModuleCreate(Sender: TObject);
    procedure ItensZQueryCalcFields(DataSet: TDataSet);
    /// Abre o DataSet
    procedure OpenDataSet(); override;
    /// Fecha o DataSet
    procedure CloseDataSet(); override;
    /// Realiza busca
    /// @param(Condicoes são as condições para a busca)
    /// @param(Tabela é a tabela no banco de dados)
    procedure Search(Condicoes: TQueryConditions; Tabela: string); override;
    procedure VendaIZQueryCalcFields(DataSet: TDataSet);
    procedure BuscaVendaFormaPagamento(IDFormaPagamento: string);
    procedure BuscaVendaData(DataInicial: string; DataFinal: string);
    procedure BuscaVendaCliente(Cliente: string);
    function BuscaData(): string;
    procedure Imprimir();
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  VendaFrData: TVendaFrData;

implementation

uses ConnectionDM, CondicaoPagamentoDM, DuplicataReceberDM, Printers;

{ TVendaFrData }

procedure TVendaFrData.DataModuleCreate(Sender: TObject);
begin
  MainDataSet := VendaIZQuery;
end;

procedure TVendaFrData.ItensZQueryCalcFields(DataSet: TDataSet);
begin
  ItensZQueryitens.Value :=
    (ItensZQueryquantidade.AsFloat * ItensZQueryvalor.AsFloat) -
    StrToFloatDef(ItensZQuerydesconto.AsString, 0);
end;

procedure TVendaFrData.OpenDataSet();
begin
  ConnectionData.EmptyQuery(VendaIZQuery, 'venda');
  ItensZQuery.Open();
end;

procedure TVendaFrData.CloseDataSet();
begin
  ItensZQuery.Close();
  VendaIZQuery.Close();
end;

procedure TVendaFrData.Search(Condicoes: TQueryConditions; Tabela: string);
begin
  ConnectionData.OpenQueryConditions(VendaIZQuery, Tabela, Condicoes);
end;

procedure TVendaFrData.VendaIZQueryCalcFields(DataSet: TDataSet);
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select sum(quantidade) as total');
    SQL.Add('FROM venda_produto where id_venda =:id_venda');
    ParamByName('id_venda').AsString := VendaIZQuery.FieldByName('id_venda').AsString;
    Open();
  end;
  VendaIZQuery.FieldByName('itens').AsString :=
    AuxiliarZQuery.FieldByName('total').AsString;
end;

procedure TVendaFrData.BuscaVendaFormaPagamento(IDFormaPagamento: string);
begin
  with VendaIZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT fp.desc_forma_pagamento, p.nome_pessoa, v.*');
    SQL.Add('FROM venda as v, forma_pagamento as fp, pessoa as p');
    SQL.Add('WHERE v.id_cliente = p.id_pessoa');
    SQL.Add('AND v.sigla_forma_pagamento = fp.sigla_forma_pagamento');
    SQL.Add('AND v.sigla_forma_pagamento =:sigla_pagamento');
    SQL.Add('AND v.data = current_date ');
    ParamByName('sigla_pagamento').AsString := IDFormaPagamento;
    Open();
  end;
end;

procedure TVendaFrData.BuscaVendaData(DataInicial: string; DataFinal: string);
begin
  with VendaIZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT fp.desc_forma_pagamento, p.nome_pessoa, v.*');
    SQL.Add('FROM venda as v, forma_pagamento as fp, pessoa as p');
    SQL.Add('WHERE v.id_cliente = p.id_pessoa');
    SQL.Add('AND v.sigla_forma_pagamento = fp.sigla_forma_pagamento');
    SQL.Add('AND (v.data >=:data_inicial AND v.data <=:data_final)');
    ParamByName('data_inicial').AsString := DataInicial;
    ParamByName('data_final').AsString := DataFinal;
    Open();
  end;
end;

procedure TVendaFrData.BuscaVendaCliente(Cliente: string);
begin
  with VendaIZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT fp.desc_forma_pagamento, p.nome_pessoa, v.*');
    SQL.Add('FROM venda as v, forma_pagamento as fp, pessoa as p');
    SQL.Add('WHERE v.id_cliente = p.id_pessoa');
    SQL.Add('AND v.sigla_forma_pagamento = fp.sigla_forma_pagamento');
    SQL.Add('AND p.nome_pessoa like :nome_pessoa');
    ParamByName('nome_pessoa').AsString := '%' + Cliente + '%';
    Open();
  end;
end;

function TVendaFrData.BuscaData(): string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT current_date as date');
    Open();
    Result := FieldByName('date').AsString;
  end;
end;

procedure TVendaFrData.Imprimir;
var
  Msg, sigla, fmt, S, linha, Desc, Prod, Val, codigo, quant, Vlr,
  Desconto, total: string;
  I, W: integer;
  Valor: string;
begin
  linha := '---------------------------------------------';
  fmt := '%0:43.43s';
  linha := Format(fmt, [linha]);
  with VendaIZQuery do begin
    //Dados da Empresa
    Msg := 'Supermercado ?????' + LineEnding;
    Msg := Msg + 'Rua Alzira Torres, ?? Lava pés' + LineEnding;
    //Dados da Venda
    Msg := Msg + 'Venda:' + FieldByName('id_venda').AsString + '-' +
      FieldByName('data').AsString + LineEnding;
    //Dados do Cliente
    //Formato para Tamanho especifico do nome
    fmt := '%0:-17.17s';
    S := Format(fmt, [FieldByName('nome_pessoa').AsString]);
    Msg := Msg + 'Cliente: ' + FieldByName('id_cliente').AsString +
      ' ' + S + LineEnding;
    Msg := Msg + LineEnding;
  end;
  //Produtos
  fmt := '%0:-20s';
  Desc := Format(fmt, ['DESCRIÇÃO']);
  Msg := Msg + 'PRODUTOS:' + LineEnding;
  Msg := Msg + 'CÓD  ' + Desc + ' ' + 'QTD UN(R$) DC VL(R$)' + LineEnding;
  Msg := Msg + linha + LineEnding;

  with ItensZQuery do begin
    for I := 1 to ItensZQuery.RecordCount do begin
      ItensZQuery.RecNo := I;
      fmt := '%0:-17.17s';
      Prod := Format(fmt, [FieldByName('desc_produto').AsString]);
      Valor := FloatToStr(FieldByName('quantidade').AsFloat *
        FieldByName('valor').AsFloat - FieldByName('desconto').AsFloat);
      fmt := '%.4d';
      codigo := Format(fmt, [FieldByName('id_produto').AsInteger]);
      fmt := '%0:4s';
      quant := Format(fmt, [FieldByName('quantidade').AsString]);
      fmt := '%0:4s';
      Vlr := Format(fmt, [FieldByName('valor').AsString]);
      fmt := '%0:4s';
      Desconto := Format(fmt, ['-' + FieldByName('desconto').AsString]);
      Valor := Format(fmt, [Valor]);
      Msg := Msg + codigo + ' ' + Prod + ' ' + quant + ' ' +
        Vlr + ' ' + Desconto + ' ' + Valor + LineEnding;
    end;
  end;
  Msg := Msg + linha + LineEnding;
  with VendaIZQuery do begin
    fmt := '%0:30s';
    Val := Format(fmt, [FieldByName('valor').AsString]);
    Msg := Msg + 'SUBTOTAL R$' + Val + LineEnding;
    Val := Format(fmt, ['-' + FieldByName('desconto').AsString]);
    Msg := Msg + 'DESCONTO   ' + Val + LineEnding;
    Val := Format(fmt, [FloatToStr(FieldByName('valor').AsFloat -
      FieldByName('desconto').AsFloat)]);

    Msg := Msg + 'TOTAL R$   ' + Val + LineEnding;
    sigla := FieldByName('sigla_forma_pagamento').AsString;
    if sigla = 'D' then begin
      Msg := Msg + 'DINHEIRO' + LineEnding;
    end else if sigla = 'T' then begin
      Msg := Msg + 'CARTÃO' + LineEnding;
    end else if sigla = 'C' then begin
      Msg := Msg + 'CHEQUE' + LineEnding;
    end else begin
      Msg := Msg + 'PRAZO' + LineEnding;
    end;
    Msg := Msg + 'AGRADECEMOS A PREFERENCIA' + LineEnding;
    Msg := Msg + 'VOLTE SEMPRE';

    Printer.RawMode := True;
    Printer.BeginDoc;
    W := 0;
    Printer.Write(msg[1], Length(msg), W);
    Printer.EndDoc;
  end;
end;

initialization
  {$I vendafrdm.lrs}

end.
